// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1

package structs

import (
	"github.com/mitchellh/go-testing-interface"

	"github.com/hashicorp/consul/acl"
)

// TestConnectProxyConfig returns a ConnectProxyConfig representing a valid
// Connect proxy.
func TestConnectProxyConfig(t testing.T) ConnectProxyConfig {
	return ConnectProxyConfig{
		DestinationServiceName: "web",
		Upstreams:              TestUpstreams(t, false),
	}
}

// TestUpstreams returns a set of upstreams to be used in tests exercising most
// important configuration patterns.
func TestUpstreams(t testing.T, enterprise bool) Upstreams {
	db := Upstream{
		// We rely on this one having default type in a few tests...
		DestinationName: "db",
		LocalBindPort:   9191,
		Config: map[string]interface{}{
			// Float because this is how it is decoded by JSON decoder so this
			// enables the value returned to be compared directly to a decoded JSON
			// response without spurious type loss.
			"connect_timeout_ms": float64(1000),
		},
	}

	geoCache := Upstream{
		DestinationType:  UpstreamDestTypePreparedQuery,
		DestinationName:  "geo-cache",
		LocalBindPort:    8181,
		LocalBindAddress: "127.10.10.10",
	}

	if enterprise {
		db.DestinationNamespace = "foo"
		db.DestinationPartition = "bar"

		geoCache.DestinationNamespace = "baz"
		geoCache.DestinationPartition = "qux"
	}

	return Upstreams{db, geoCache, {
		DestinationName:     "upstream_socket",
		LocalBindSocketPath: "/tmp/upstream.sock",
		LocalBindSocketMode: "0700",
	},
	}
}

// TestAddDefaultsToUpstreams takes an array of upstreams (such as that from
// TestUpstreams) and adds default values that are populated during
// registration. Use this for generating the expected Upstreams value after
// registration.
func TestAddDefaultsToUpstreams(t testing.T, upstreams []Upstream, entMeta acl.EnterpriseMeta) Upstreams {
	ups := make([]Upstream, len(upstreams))
	for i := range upstreams {
		ups[i] = upstreams[i]
		// Fill in default fields we expect to have back explicitly in a response
		if ups[i].DestinationType == "" {
			ups[i].DestinationType = UpstreamDestTypeService
		}
		if ups[i].DestinationNamespace == "" {
			ups[i].DestinationNamespace = entMeta.NamespaceOrEmpty()
		}
		if ups[i].DestinationPartition == "" {
			ups[i].DestinationPartition = entMeta.PartitionOrEmpty()
		}
	}
	return ups
}
